iT邦幫忙

2021 iThome 鐵人賽

DAY 14
0

在進入 Go 的重頭戲 Concurrency 前,需要先來了解一下執行序(thread)是什麼,那麼我們就進入正題吧 ─=≡Σ(((っ゚∀゚)っ

Process

再講 Thread 前,需要稍微提到 Process 這個東西:

  • 程式碼執行時會產生出 Process,並且透過 Process 去執行
  • Process 需要一些資源才能完成工作,如 CPU、記憶體、I/O 裝置
  • 每個 Process 都是互相獨立
  • Process 不是執行單位,而是 Thread 的容器

Tread

Thread 可以說是 Process 這個工廠內的作業員,一個 Prcocess 內可以有一到多個 Thread 去處理這個工廠內的業務,而 Thread 又可以分成單執行緒(single-thread)或是多執行緒(multi-thread)。

單執行緒的形況下,每行程式碼都會依照順序執行,以工廠的概念就是每件事情都一定要 A 完成後才能做 B。

多執行緒的話,並沒有誰先處理的狀況,只要 CPU 數量足夠就能夠同步處理,以工廠概念就是 A 跟 B 只要人力允許的情況下,就能夠同步進行作業,效率更能夠大大的提升。

用 Go 來示範看看吧!

單執行緒:

package main

import (
	"fmt"
	"time"
)

func say(s string) {
	for i := 0; i < 5; i++ {
		time.Sleep(100 * time.Millisecond)
		fmt.Println(s)
	}
}

func main() {
	say("world")
	say("hello")
}

// Output:
//   world
//   world
//   world
//   world
//   world
//   hello
//   hello
//   hello
//   hello
//   hello

多執行序:

package main

import (
	"fmt"
	"time"
)

func say(s string) {
	for i := 0; i < 5; i++ {
		time.Sleep(100 * time.Millisecond)
		fmt.Println(s)
	}
}

func main() {
	go say("world")
	say("hello")
}

// Output:
//   hello
//   world
//   world
//   hello
//   hello
//   world
//   world
//   hello
//   hello

嘿,有發現只要呼叫函式時在前面加 go ,順序就不會是先做完 say("world") 才執行 say("hello") 嗎?

這就是 Go 的 goroutine,這個就讓我們留到明天再說吧!

結尾

有任何問題,歡迎與我告知 :)
本篇文章同步發佈於我的部落格


上一篇
Day13# defer
下一篇
Day15# Goroutines
系列文
30 天學 Golang?Go 啦哪次不 Go20
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言